#!/bin/bash

if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
    set -x
fi
set -eu
set -o pipefail

SCRIPTDIR=$(dirname $0)

if [ -e "/etc/redhat-release" ]; then
    # TODO(hjensas): Once ndisc6 package is available in EPEL8 drop this,
    # and add the package back in pkg-map.
    # See: https://bugzilla.redhat.com/show_bug.cgi?id=1779134
    if type dnf &>/dev/null; then
        dnf -v -y install ndisc6 || true
    else
        yum -v -y install ndisc6 || true
    fi
    # NOTE(TheJulia): While the internal client which every networkmanager user
    # should have is internal, dhclient has better behavior which includes
    # shutting down the port between retries which is critical for recovery
    # from LACP port blocking situations. As such, we'll force it to dhclient.
    # For more information, see https://storyboard.openstack.org/#!/story/2008001
    DIB_DHCP_CLIENT=${DIB_DHCP_CLIENT:-dhclient}
fi


# Sets appropriate NetworkManager configuration, if the folder is present.
if [ -x "/etc/NetworkManager" ]; then
    install -D -g root -o root -m 0644 ${SCRIPTDIR}/NetworkManager-conf.d-00-main.conf /etc/NetworkManager/conf.d/00-main.conf
    sed -i "s/DIB_DHCP_CLIENT/${DIB_DHCP_CLIENT:-internal}/g" /etc/NetworkManager/conf.d/00-main.conf
    sed -i "s/DIB_DHCP_TIMEOUT/${DIB_DHCP_TIMEOUT:-30}/g" /etc/NetworkManager/conf.d/00-main.conf
fi


# this script is not needed on Gentoo.
if [ "$DISTRO_NAME" != "gentoo" ]; then
    install -D -g root -o root -m 0755 ${SCRIPTDIR}/dhcp-all-interfaces.sh /usr/local/sbin/dhcp-all-interfaces.sh
    sed -i "s/DIB_DHCP_TIMEOUT/${DIB_DHCP_TIMEOUT:-30}/" /usr/local/sbin/dhcp-all-interfaces.sh
fi

if [ -f /etc/dhcp/dhclient.conf ] ; then
    # Set the dhclient timeout configurations to match DIB_DHCP_TIMEOUT,
    if grep -o "^timeout " /etc/dhcp/dhclient.conf ; then
        sed -i -e "s/^timeout .*/# \"timeout\" Value set by dhcp-all-interfaces\ntimeout ${DIB_DHCP_TIMEOUT:-30};/" /etc/dhcp/dhclient.conf
    else
        echo -e "# \"timeout\" Value set by dhcp-all-interfaces\ntimeout ${DIB_DHCP_TIMEOUT:-30};" >> /etc/dhcp/dhclient.conf
    fi
    if grep -o "^retry " /etc/dhcp/dhclient.conf ; then
        sed -i -e '/^retry/s/^/# \"retry\" Value commented by dhcp-all-interfaces\n# /g' /etc/dhcp/dhclient.conf
    fi
fi

if [ "$DIB_INIT_SYSTEM" == "upstart" ]; then
    if [ -e "/etc/redhat-release" ] ; then
        # the init system is upstart but networking is using sysv compatibility (i.e. Centos/RHEL 6)
        install -D -g root -o root -m 0755 ${SCRIPTDIR}/dhcp-all-interfaces.init /etc/init.d/dhcp-all-interfaces
        chkconfig dhcp-all-interfaces on
    else
        install -D -g root -o root -m 0755 ${SCRIPTDIR}/dhcp-all-interfaces.conf /etc/init/dhcp-all-interfaces.conf
    fi
elif [ "$DIB_INIT_SYSTEM" == "systemd" ]; then
    install -D -g root -o root -m 0644 ${SCRIPTDIR}/dhcp-interface@.service /usr/lib/systemd/system/dhcp-interface@.service
    install -D -g root -o root -m 0644 ${SCRIPTDIR}/dhcp-all-interfaces-udev.rules /etc/udev/rules.d/99-dhcp-all-interfaces.rules
    sed -i "s/TimeoutStartSec=DIB_DHCP_TIMEOUT/TimeoutStartSec=$(( ${DIB_DHCP_TIMEOUT:-30} * 2 ))s/" /usr/lib/systemd/system/dhcp-interface@.service
elif [ "$DIB_INIT_SYSTEM" == "sysv" ]; then
    install -D -g root -o root -m 0755 ${SCRIPTDIR}/dhcp-all-interfaces.init /etc/init.d/dhcp-all-interfaces
    update-rc.d dhcp-all-interfaces defaults
elif [ "$DISTRO_NAME" == "gentoo" ]; then
    # let ipv6 use normal slaac
    sed -i 's/slaac/#slaac/g' /etc/dhcpcd.conf
    # don't let dhcpcd set domain name or hostname
    sed -i 's/domain_name\,\ domain_search\,\ host_name/domain_search/g' /etc/dhcpcd.conf
    rc-update add dhcpcd default
fi
